package com.lbj.mall.cart.controller;

import com.lbj.mall.cart.entity.vo.CartItemVo;
import com.lbj.mall.cart.entity.vo.CartVo;
import com.lbj.mall.cart.service.CartService;
import com.lbj.mall.common.constant.Host;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.util.List;
import java.util.concurrent.ExecutionException;

@Controller
public class CartController {

    @Autowired
    CartService cartService;

    /**
     * 获取当前用户的购物车商品项
     * @return
     */
    @GetMapping(value = "/currentUserCartItems")
    @ResponseBody
    public List<CartItemVo> getCurrentCartItems() {

        List<CartItemVo> cartItemVoList = cartService.getUserCartItems();

        return cartItemVoList;
    }

    /**
     * 删除选中的商品
     */
    @GetMapping("/deleteItem")
    public String deleteItem(@RequestParam("skuId") Long skuId) {
        cartService.deleteItem(skuId);
        return Host.REDIRECT + Host.CART + "cart.html";
    }

    /**
     * 勾选购物车中商品 checkItem?skuId=34&checked=0
     */
    @GetMapping("/checkItemSelect")
    public String checkItemSelect(@RequestParam("skuId") Long skuId, @RequestParam("checked") Boolean checked) {
        cartService.checkItemSelect(skuId, checked);
        return Host.REDIRECT + Host.CART + "cart.html";
    }

    /**
     * 修改购物车中商品数量
     */
    @GetMapping("/checkItemNum")
    public String checkItemNum(@RequestParam("skuId") Long skuId, @RequestParam("num") Integer num) {
        cartService.checkItemNum(skuId, num);
        return Host.REDIRECT + Host.CART + "cart.html";
    }

    /**
     * 浏览器有一个 cookie:user-key，这个是用来标识用户身份，一个月过期；
     * 如果第一次使用京东购物车功能，都会给一个临时的用户身份；
     * 浏览器以后会保存这个数据，每次访问都会带上这个cookie；
     * <p>
     * 登录：session有
     * 没登录：按照cookie里面打来的user-key来做
     * 第一次：如果没有临时用户，帮忙创建一个临时用户
     * <p>
     * 因为每次进来都需要上述的步骤判断，可以考虑使用拦截器
     * <p>
     * 获取购物车数据
     */
    @GetMapping("cart.html")
    public String toCartPage(Model model) throws ExecutionException, InterruptedException {
        CartVo cartVo = cartService.getCart();
        model.addAttribute("cart", cartVo);
        return "cart";
    }

    /**
     * 添加到购物车
     * <p>
     * 这里有一个问题：当用户无限次刷新当前页面时，则购物车中的数据会一直被添加
     * 解决方法就是不直接返回当前页面，而是经过重定向的方式
     * 京东的解决方案也是这样，如果将按钮下的链接（不是浏览器链接）进行刷新，购物车数据也会增加
     */
    @GetMapping("/addToCart")
    public String addToCart(@RequestParam("skuId") Long skuId,
                            @RequestParam("num") Integer num,
                            RedirectAttributes attributes) throws ExecutionException, InterruptedException {
        cartService.addToCart(skuId, num);
        // RedirectAttributes有两个添加属性的方法
        // 1:attributes.addFlashAttribute() 将数据添加到session中，只能获取一次
        // 2:attributes.addAttribute("skuId", skuId) 如果是转发则将数据添加的请求域中，如果是重定向则将数据拼接到链接后面
        attributes.addAttribute("skuId", skuId);
        // 重定向：/表示当前ip:port下，因为我们使用域名所以必须要使用完整的域名
        return Host.REDIRECT + Host.CART + "success.html";
    }

    /**
     * 为了解决在浏览器中无限刷新会导致购物车中的数据无限增大，
     * 这里的解决方案就是在“/addToCart”接口中负责添加数据，
     * 添加完数据后重定向到新的页面，在新的页面中只调用获取数据的接口，
     * 这样就算浏览器中无限刷新页面，也只会无限获取数据，而不会对购物车数据造成修改
     */
    @GetMapping("/success.html")
    public String toSuccessPage(@RequestParam("skuId") Long skuId
            , Model model) {
        CartItemVo item = cartService.getCardItem(skuId);
        model.addAttribute("item", item);
        return "success";
    }
}
